//
//  GKNetworkTools.h
//  Created by 花菜ChrisCai on 2014/6/2.
//  Copyright © 2014年 Chris. All rights reserved.
//  网络请求工具类，负责整个项目中所有的网络请求

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface GKUploadParams : NSObject
/**
 *  上传文件的二进制数据
 */
@property (nonatomic, strong) NSData *data;
/**
 *  上传的参数名称
 */
@property (nonatomic, copy) NSString *name;
/**
 *  上传到服务器的文件名称
 */
@property (nonatomic, copy) NSString *fileName;

/**
 *  上传文件的类型
 */
@property (nonatomic, copy) NSString *mimeType;
@end

@class GKUploadParams;
typedef enum{
    GKNetworkStatusUnknown           = 0,    //未知网络
    GKNetworkStatusNotReachable      = 1,    //没有网络
    GKNetworkStatusReachableViaWWAN  = 2,    //手机自带网络
    GKNetworkStatusReachableViaWiFi  = 3     //wifi
    
}GKNetworkStatus; // 网络状态

typedef void(^GKResponseSuccess)(id responseObject);
typedef void(^GKResponseFailure)(NSError *  error);
@interface GKNetworkingManager : NSObject

/**  获取网络 */
@property (nonatomic,assign)GKNetworkStatus networkStatus;
/** 是否有网 */
@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable;
/** 3G/4G网络 */
@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN;
/** WiFi环境 */
@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi;


#pragma mark -
#pragma mark - 方法列表
- (instancetype)init __attribute__((unavailable("init方法不可用,请使用sharedManager")));
+ (instancetype)sharedManager;
/**
 *  程序启动时开启网络监测
 *  AppDelegate中调用该方法
 *  开启网络监测
 */
- (void)startMonitoring;

/**
 *  发送一个GET请求
 *
 *  @param url     请求路径
 *  @param params  请求参数
 *  @param success 请求成功后的回调（请将请求成功后想做的事情写到这个block中）
 *  @param failure 请求失败后的回调（请将请求失败后想做的事情写到这个block中）
 */
+ (nullable NSURLSessionDataTask *)get:(NSString *)url
                                params:(NSDictionary *)params
                               success:(GKResponseSuccess)success
                               failure:(GKResponseFailure)failure;

/**
 *  发送一个POST请求
 *
 *  @param url     请求路径
 *  @param params  请求参数
 *  @param success 请求成功后的回调（请将请求成功后想做的事情写到这个block中）
 *  @param failure 请求失败后的回调（请将请求失败后想做的事情写到这个block中）
 */
+ (nullable NSURLSessionDataTask *)post:(NSString *)url
                                 params:(NSDictionary * )params
                                success:(GKResponseSuccess)success
                                failure:(GKResponseFailure)failure;


/**
 *  上传请求
 *
 *  @param URLString  请求的基本的url
 *  @param parameters 请求的参数字典
 *  @param success    请求成功后的回调（请将请求成功后想做的事情写到这个block中）
 *  @param failure    请求失败后的回调（请将请求失败后想做的事情写到这个block中）
 */
+ (void)Upload:(NSString *)urlString
    params:(NSDictionary *)params
   uploadParam:(GKUploadParams *)uploadParam
       success:(GKResponseSuccess)success
       failure:(GKResponseFailure)failure;
/**
 *  发送get请求解析html数据
 *
 *  @param urlString 请求的基本的html地址
 *  @param success   请求成功后回调
 *  @param failure   请求失败后回调
 */
+ (void)getHtmlCodeWithUrlString:(NSString *)urlString success:(void (^)(NSData * data))success failure:(void(^)(NSError * error))failure;
/**
 *  取消所有任务
 */
+ (void)cancelAllTask;
NS_ASSUME_NONNULL_END
@end